import { Persistent, BasicKeys } from '/@/utils/cache/persistent';
import { CacheTypeEnum, TOKEN_KEY } from '/@/enums/cacheEnum';
import projectSetting from '/@/settings/projectSetting';

const { permissionCacheType } = projectSetting;
const isLocal = permissionCacheType === CacheTypeEnum.LOCAL;

/**
 * 获取存储的令牌。
 *
 * @returns {any} 返回存储在认证缓存中的令牌。
 */
export function getToken() {
  return getAuthCache(TOKEN_KEY);
}

/**
 * 根据指定的键从认证缓存中获取数据。
 *
 * @template T - 预期返回的数据类型。
 * @param {BasicKeys} key - 认证缓存中的数据键名。
 *
 * @returns {T} 返回从缓存中获取的指定类型的数据。
 */
export function getAuthCache<T>(key: BasicKeys) {
  // 根据运行时配置选择是使用本地存储还是会话存储。
  const fn = isLocal ? Persistent.getLocal : Persistent.getSession;
  // 以指定类型返回获取的数据。
  return fn(key) as T;
}

/**
 * 将指定的数据存储在认证缓存中。
 *
 * @param {BasicKeys} key - 要存储数据的键名。
 * @param {any} value - 需要存储的数据。
 *
 * @returns {void} 该函数没有返回值。
 */
export function setAuthCache(key: BasicKeys, value) {
  // 根据运行时配置选择是使用本地存储还是会话存储进行设置。
  const fn = isLocal ? Persistent.setLocal : Persistent.setSession;
  // 存储数据，并设置可覆盖（true）。
  return fn(key, value, true);
}

/**
 * 清除所有认证缓存。
 *
 * @param {boolean} [immediate=true] - 是否立即清除，默认为true。
 *
 * @returns {void} 该函数没有返回值。
 */
export function clearAuthCache(immediate = true) {
  // 根据运行时配置选择是清除本地存储还是会话存储中的数据。
  const fn = isLocal ? Persistent.clearLocal : Persistent.clearSession;
  // 清除操作。
  return fn(immediate);
}
